/**
 * @作者 zxy
 * @时间 2023-04-28 17:04
 * @说明 A 和 B 在一个 3 x 3 的网格上玩井字棋。
 * 井字棋游戏的规则如下：
 * 玩家轮流将棋子放在空方格 (" ") 上。
 * 第一个玩家 A 总是用 "X" 作为棋子，而第二个玩家 B 总是用 "O" 作为棋子。
 * "X" 和 "O" 只能放在空方格中，而不能放在已经被占用的方格上。
 * 只要有 3 个相同的（非空）棋子排成一条直线（行、列、对角线）时，游戏结束。
 * 如果所有方块都放满棋子（不为空），游戏也会结束。
 * 游戏结束后，棋子无法再进行任何移动。
 * 给你一个数组 moves，其中每个元素是大小为 2 的另一个数组（元素分别对应网格的行和列），它按照 A 和 B 的行动顺序（先 A 后 B）记录了两人各自的棋子位置。
 * 如果游戏存在获胜者（A 或 B），就返回该游戏的获胜者；如果游戏以平局结束，则返回 "Draw"；如果仍会有行动（游戏未结束），则返回 "Pending"。
 * 你可以假设 moves 都 有效（遵循井字棋规则），网格最初是空的，A 将先行动。
 */
public class Solution {
    /**
     * 执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
     * 内存消耗：39.4 MB, 在所有 Java 提交中击败了8.53%的用户
     * @param moves
     * @return
     */
    public String tictactoe(int[][] moves) {
        int[][] row = new int[3][2];
        int[][] column = new int[3][2];
        int[] diagonal1 = new int[2];
        int[] diagonal2 = new int[2];
        for (int i = 0; i < moves.length; i++) {
            if (i == 9) return "Draw";
            if (moves[i][0] == 0 && moves[i][1] == 0) {
                row[0][i % 2]++;
                column[0][i % 2]++;
                diagonal1[i % 2]++;
                if (row[0][i % 2] == 3 || column[0][i % 2] == 3 || diagonal1[i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 0 && moves[i][1] == 1) {
                row[0][i % 2]++;
                column[1][i % 2]++;
                if (row[0][i % 2] == 3 || column[1][i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 0 && moves[i][1] == 2) {
                row[0][i % 2]++;
                column[2][i % 2]++;
                diagonal2[i % 2]++;
                if (row[0][i % 2] == 3 || column[2][i % 2] == 3 || diagonal2[i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 1 && moves[i][1] == 0) {
                row[1][i % 2]++;
                column[0][i % 2]++;
                if (row[1][i % 2] == 3 || column[0][i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 1 && moves[i][1] == 1) {
                row[1][i % 2]++;
                column[1][i % 2]++;
                diagonal1[i % 2]++;
                diagonal2[i % 2]++;
                if (row[1][i % 2] == 3 || column[1][i % 2] == 3 || diagonal1[i % 2] == 3 || diagonal2[i % 2] == 3)
                    return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 1 && moves[i][1] == 2) {
                row[1][i % 2]++;
                column[2][i % 2]++;
                if (row[1][i % 2] == 3 || column[2][i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 2 && moves[i][1] == 0) {
                row[2][i % 2]++;
                column[0][i % 2]++;
                diagonal2[i % 2]++;
                if (row[2][i % 2] == 3 || column[0][i % 2] == 3 || diagonal2[i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 2 && moves[i][1] == 1) {
                row[2][i % 2]++;
                column[1][i % 2]++;
                if (row[2][i % 2] == 3 || column[1][i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            } else if (moves[i][0] == 2 && moves[i][1] == 2) {
                row[2][i % 2]++;
                column[2][i % 2]++;
                diagonal1[i % 2]++;
                if (row[2][i % 2] == 3 || column[2][i % 2] == 3 || diagonal1[i % 2] == 3) return i % 2 == 0 ? "A" : "B";
            }
        }
        return "Pending";
    }
}
